package com.gitee.feizns.quickstart.ding.talk.event.contacts;

import com.dingtalk.api.response.OapiRoleGetroleResponse;
import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.dingtalk.open.app.api.GenericEventListener;
import com.dingtalk.open.app.api.message.GenericOpenDingTalkEvent;
import com.dingtalk.open.app.stream.protocol.event.EventAckStatus;
import com.gitee.feizns.quickstart.ding.talk.api.top.api.v2.department.Get;
import com.gitee.feizns.quickstart.ding.talk.api.v10.oauth2.AccessToken;

/**
 * 联系人事件侦听器
 * @author feizns
 * @since 2025/3/24
 */
public interface ContactsEventListener extends GenericEventListener {

    /**
     * 访问令牌
     * @return {@link AccessToken }
     */
    AccessToken accessToken();

    /**
     * 活动
     * @param event 事件
     * @return {@link EventAckStatus }
     */
    @Override
    default EventAckStatus onEvent(GenericOpenDingTalkEvent event) {
        AccessToken accessToken = accessToken();
        //角色及角色组相关事件处理
        LabelConfAddListener.onEvent(event, accessToken, this::onInsertRole, this::onInsertRoleGroup);
        LabelConfModifyListener.onEvent(event, accessToken, this::onUpdateRole, this::onUpdateRoleGroup);
        LabelConfDelListener.onEvent(event, this::onDeleteRoleOrRoleGroup);
        //部门相关事件处理
        OrgDeptCreateListener.onEvent(event, deptId -> this.onInsertDept(Get.execute(accessToken.get(), deptId)));
        OrgDeptModifyListener.onEvent(event, deptId -> this.onUpdateDept(Get.execute(accessToken.get(), deptId)));
        OrgDeptRemoveListener.onEvent(event, this::onDeleteDept);
        //用户相关事件处理
        UserAddOrgListener.onEvent(event, accessToken, this::onInsertUser);
        UserLeaveOrgListener.onEvent(event, this::onDeleteUser);
        UserModifyOrgListener.onEvent(event, (userid, data) -> {
            OapiV2UserGetResponse.UserGetResponse resp = com.gitee.feizns.quickstart.ding.talk.api.top.api.v2.user.Get.execute(accessToken.get(), userid);
            if ( resp != null )
                this.onUpdateUser(resp);
        });
        return EventAckStatus.SUCCESS;
    }

    /**
     * 插入（用户）
     * @param user 用户
     */
    default void onInsertUser(String userid, OapiV2UserGetResponse.UserGetResponse user) {}

    /**
     * 插入（部门）
     * @param dept 部门
     */
    default void onInsertDept(OapiV2DepartmentGetResponse.DeptGetResponse dept) {}

    /**
     * 插入（角色）
     * @param role 角色
     */
    default void onInsertRole(Long id, OapiRoleGetroleResponse.OpenRole role) {}

    /**
     * 插入（角色组）
     * @param roleGroup 角色组
     */
    default void onInsertRoleGroup(Long id, OapiRoleGetroleResponse.OpenRole roleGroup) {}

    /**
     * 更新（用户）
     * @param user 用户
     */
    default void onUpdateUser(OapiV2UserGetResponse.UserGetResponse user) {}

    /**
     * 更新（部门）
     * @param dept 部门
     */
    default void onUpdateDept(OapiV2DepartmentGetResponse.DeptGetResponse dept) {}

    /**
     * 更新（角色）
     * @param role 角色
     */
    default void onUpdateRole(Long id, OapiRoleGetroleResponse.OpenRole role) {}

    /**
     * 更新（角色组）
     * @param roleGroup 角色组
     */
    default void onUpdateRoleGroup(Long id, OapiRoleGetroleResponse.OpenRole roleGroup) {}

    /**
     * 删除（用户）
     * @param userid 用户 ID
     */
    default void onDeleteUser(String userid) {}

    /**
     * 删除（部门）
     * @param deptId 部门编号
     */
    default void onDeleteDept(Long deptId) {}

    /**
     * 删除（角色或角色组）
     * @param id 编号
     */
    default void onDeleteRoleOrRoleGroup(Long id) {}

}
